﻿using System.Collections.Generic;
using Gp.Scripts.Data;
using Gp.Scripts.Data.Equip;
using Gp.Scripts.Core;
using UnityEngine;


namespace Gp.Scripts.Core {
    // public class AttackPreEntity : IActionEntity {
    //     public BaseUnit Attacker { get; }
    //     public BaseUnit Target { get; }
    //     public SkillEntity SkillEntity { get; }
    //
    //     public AttackPreEntity(BaseUnit attacker, BaseUnit target, SkillEntity skillEntity) {
    //         Attacker = attacker;
    //         Target = target;
    //         SkillEntity = skillEntity;
    //     }
    // }
    //
    // public class AttackPreActionResult {
    //     public bool IsSuccess { get; set; } = true;
    //
    //     // 格挡值
    //     public int DefenceValue { get; set; }
    //
    //
    //     public bool IsStoppable { get; set; }
    //
    //     // public List<OpportunityAttackArgs> OpportunityAttackArgs { get; set; } = new();
    // }


    // public class OpportunityAttackArgs {
    //     /// 判断某个单位是否能够发起借机攻击
    //     public static bool OpportunityAttackAggressorJudge(BaseUnit aggressor) {
    //         var weaponAttackEntity = aggressor.AbilityManager.GetSkillEntity<WeaponAttackEntity>();
    //         if (weaponAttackEntity == null)
    //             return false;
    //
    //         // 判断是否持有近战攻击武器
    //         var meleeWeapon = AggressorWeaponTagJudge(weaponAttackEntity.MainHead) ||
    //                           AggressorWeaponTagJudge(weaponAttackEntity.OffHand);
    //
    //         // 判断单位是否处于近战位
    //         var pos = MeleeBaseWeaponType.MeleePos.Contains(aggressor.CurrentCell.Index);
    //
    //         string log = $"借机攻击判定结果：{meleeWeapon && pos}\n" +
    //                      $"[判定单位]: {aggressor.prefabData.ItemName}\n" +
    //                      $"[站位判定]: {pos}\n" +
    //                      $"[单位站位]: {aggressor.CurrentCell.Index}\n" +
    //                      $"[有效近战位]: {string.Join(", ", MeleeBaseWeaponType.MeleePos)}\n" +
    //                      $"[武器判定]: {meleeWeapon}\n" +
    //                      // $"[主手持有武器]：{weaponAttackEntity.MainHead}\n" +
    //                      // $"[副手持有武器]：{weaponAttackEntity.OffHand}\n";
    //         Debug.Log(log);
    //         return meleeWeapon && pos;
    //     }
    //
    //     /// <summary>
    //     /// 判断某个单位能否发动借机攻击
    //     /// </summary>
    //     /// <param name="equip"></param>
    //     /// <returns></returns>
    //     private static bool AggressorWeaponTagJudge(WeaponEquip equip) {
    //         // 装备含有近战武器标签或含有快速远程武器标签
    //         return equip.GetWeaponType() is MeleeBaseWeaponType || equip.ContainsTag(WeaponTag.QuickRangedWeapon);
    //     }
    //
    //
    //     /// 判断是否会被触发借机攻击
    //     public static bool OpportunityAttackTargetJudge(AttackPreEntity preEntity) {
    //         // 如果为武器攻击，判断是否含有远程武器，并且位于近战攻击位
    //         if (preEntity.SkillEntity is WeaponAttackEntity weaponAttackEntity) {
    //             // 判断武器类型
    //             var rangedWeapon = TargetWeaponTagJudge(weaponAttackEntity.MainHead)
    //                                || TargetWeaponTagJudge(weaponAttackEntity.OffHand);
    //
    //             // 判断是否处于近战位
    //             var pos = MeleeBaseWeaponType.MeleePos.Contains(preEntity.Attacker.CurrentCell.Index);
    //             return rangedWeapon && pos;
    //         }
    //
    //         return false;
    //     }
    //
    //     private static bool TargetWeaponTagJudge(WeaponEquip equip) {
    //         // 装备含有远程武器标签，并且不含有快速远程武器标签
    //         return equip.GetWeaponType() is RangedBaseWeaponType && !equip.ContainsTag(WeaponTag.QuickRangedWeapon);
    //     }
    //
    //
    //     /// <summary>
    //     /// 借机攻击发起者
    //     /// </summary>
    //     public BaseUnit Aggressor { get; set; }
    // }

    
    // [ActionRule("预攻击行动")]
    // public class AttackPreAction : AbstractGameAction<AttackPreEntity> {
    //     public override IRuleGroup<AttackPreEntity> BuildRules() {
    //         return GeneralRuleGroup<AttackPreEntity>
    //                 .BindData(InitParameters)
    //                 .Final(CalResult)
    //             ;
    //     }
    //
    //
    //     private static Dictionary<object, ModifierData> InitParameters(AttackPreEntity preEntity) {
    //         var res = new Dictionary<object, ModifierData>();
    //         return res;
    //     }
    //
    //
    //     private IActionResult CalResult(AttackPreEntity preEntity, IReadOnlyDictionary<object, ModifierData> modifies) {
    //         var res = new AttackPreActionResult {
    //             OpportunityAttackArgs = HandleOpportunityAttack(preEntity),
    //             IsStoppable = true,
    //         };
    //
    //         return null;
    //     }
    //
    //
    //     // 处理借机攻击
    //     private List<OpportunityAttackArgs> HandleOpportunityAttack(AttackPreEntity preEntity) {
    //         var res = new HashSet<OpportunityAttackArgs>();
    //         // 如果发起者不满足借机攻击条件，返回空数组
    //         if (!OpportunityAttackArgs.OpportunityAttackTargetJudge(preEntity))
    //             return new List<OpportunityAttackArgs>(res);
    //
    //
    //         var model = GetModel<CellGridModel>();
    //         // 获取当前和受击目标同侧的所有单位
    //         var cells = model.PlaceHolder.GetCellsBySide(preEntity.Target.Side);
    //         foreach (var c in cells) {
    //             var aggressor = model.PlaceHolder.GetUnit(c);
    //             if (aggressor == null) continue;
    //
    //             // 获取攻击技能实体
    //             var entity = aggressor.AbilityManager.GetSkillEntity<WeaponAttackEntity>();
    //             if (entity == null) continue;
    //
    //             // 如果技能发起者所在位置满足借机攻击目标
    //             // if (entity.CanTargetAttack(preEntity.Caster.CurrentCell) &&
    //             //     OpportunityAttackArgs.OpportunityAttackAggressorJudge(aggressor)) {
    //             //     
    //             //     
    //             // }
    //             // 添加入结果
    //             res.Add(new OpportunityAttackArgs {
    //                 Aggressor = aggressor
    //             });
    //         }
    //
    //
    //         return new List<OpportunityAttackArgs>(res);
    //     }
}